package com.leyou.search.pojo;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.util.List;
import java.util.Map;

/**
 * 商品文档对象
 * @Document: 映射ES的文档
 *    indexName: 索引库名称
 *    type: 类型
 *    shards：分片数，默认5
 *    replicas：副本数，默认1
 *  @Id：标记为文档的主键
 *      一旦使用@Id主键，文档的主键由我们程序设定，而不是随机生成
 *
 *  @Field: 映射一个域
 *     type： 域的类型
 *         Text: 字符串，用于可分词的域
 *         Keyword：字符串，用于不分词的域
 *         Integer/Long/Double/Float：数值类型，必然不分词的
 *         Date: 日期类型，不分词
 *         Boolean：布尔类型，不分词
 *         Object：对象类型，用于一个JavaBean或对象集合类型，如 User user或 List<User>，
 *                  只要是对象类型，那么对象的每个属性默认都是（索引）分词的。
 *     index： 是否索引，默认true
 *     analyzer： 分词器算法，该属性在分词基础上使用，默认使用StandardAnalyzer（单字分词）
 *                 如果中文的话，一般使用IK分词器
 *                     ik_smart：最小分词   我是程序员 -> 我  是   程序员
 *                     ik_max_word：最细分词   我是程序员  ->  我  是   程序员  程序  员
 *
 *
 *  注意：一个Goods对应一个Spu!!!
 */
@Data
@Document(indexName = "goods",type = "docs")
public class Goods {

    @Id
    private Long id;//商品ID  spu的id

    @Field(type = FieldType.Text , analyzer = "ik_max_word")
    private String spuName;//商品名称   索引，分词  注意：高亮字段必须是索引分词的

    @Field(type = FieldType.Text , analyzer = "ik_max_word")
    private String all;//用于把所有需要被检索的域的内容归集到一起，方便分词检索   索引，分词  （spuName+subTitle+title等）

    @Field(type = FieldType.Keyword , index = false)
    private String subTitle;//副标题    不索引，不分词

    @Field(type = FieldType.Keyword , index = false)
    private String skus;//商品下的Sku列表，为了减少索引字段，存储List<Sku>的json字符串  不分词，不索引

    @Field(type = FieldType.Long)
    private List<Long> price; //商品的所有价格列表   索引，不分词

    @Field(type = FieldType.Long)
    private Long createTime;//商品创建时间   索引，不分词

    @Field(type = FieldType.Long)
    private Long categoryId;//商品分类ID（第三级分类ID）   索引，不分词

    @Field(type = FieldType.Long)
    private Long brandId;//商品品牌ID     索引，不分词

    @Field(type = FieldType.Object)
    private Map<String,Object> specs;//商品的规格参数    索引，分词
}
